參數的傳遞機制
使用方法時,若要取得回傳結果得透過return敘述;但是它只能回傳一個結果。
方法之間若要回傳多個參數值,就必須要進一步了解方法中參數、引數間資料的傳遞。
方法定義時若括號內有指定對象,稱為參數(Parameter)。
呼叫方法才有傳遞資料的動作,稱為引數(Argument)。
實際引數(Actual argument,簡稱引數):程式中呼叫方法將資料傳遞者。
形式參數(Formal parameter,簡稱參數):方法定義時設定參數接收資料,進入方法主體執行敘述或運算。
傳值呼叫(Passing by value)
是指實際引數呼叫方法時,會先將變數內容(值value)複製,再把副本傳遞形式參數。
注意:實際引數所傳遞的引數和形式參數的方法必須是相同的型別
由於實際引數和形式參數分佔不同的記憶體位置
方法定義所接受的是變數值,而非變數本身
執行程式時,形式參數若有改變,並不會影響原來實際引數的內容。
using System;
namespace HelloWorld
{
class Arithmetic
{
// 計算等差數列的和
private int progression(int first, int last, int diversity, out int number)
{
int sum = 0, temp = 0;
number = 0; // 項數
// 若首項大於末項,交換它們
if (first > last)
{
temp = first;
first = last;
last = temp;
}
// 計算項數
number = (last - first) / diversity + 1;
// 計算等差數列的和
sum = (number * (first + last)) / 2;
return sum; // 回傳計算結果
}
static void Main(string[] args)
{
// 定義變數,並將 item(差值)設置為 5
int first_value = 125;
int last_value = 421;
int item = 5; // 差值為 5
// 創建 Arithmetic 類的實例
Arithmetic copyValue = new Arithmetic();
// 計算等差數列和與項數
int number_of_terms; // 用來存儲項數
int total = copyValue.progression(first_value, last_value, item, out number_of_terms);
// 顯示結果
Console.WriteLine($"---等差數列的計算---");
Console.WriteLine($"初始值(首項):{first_value}");
Console.WriteLine($"終止值(末項):{last_value}");
Console.WriteLine($"差值:{item}");
Console.WriteLine($"項數:{number_of_terms}"); // 顯示項數
Console.WriteLine($"{first_value} 到 {last_value} 的差數和:{total:N0}");
Console.WriteLine($"首項 = {first_value},末項 = {last_value},差值 = {item}");
}
}
}
N0
是一個標準數字格式字串,N
表示數字格式化,而 0
表示顯示零個小數位。這會將數字格式化為包含千位分隔符的整數格式。
傳址呼叫
傳遞引數另一種機制是傳址。
傳址是記憶體的位址。
實際引數呼叫方法時會傳遞記憶體未址給形式參數,連同記憶體儲存的資料也會連帶傳送;
形成實際引數、形式參數共用相同的記憶體位址,當形式參數的植被改變時,也會影響實際引數的內容。
何種情形之下會使用傳址呼叫?
通常是方法內要將多項資料結果回傳,而且return敘述只能回傳一個結果情況下
使用傳址呼叫注意兩件事:
無論是實際引數或形式參數,其型別前必須加上方法參數ref或out。
實際引數所指定的引數,必須給予初值設定。
傳值和傳址還在釐清中,過幾天會再補充說明
以上來源:從零開始學visual C# 2017程式設計、W3Schools、詢問chatGPT
內容有誤的話,請留言或發訊息給我